Comment...

Comment empêcher la modification de certains champs dans une vue ?

Dans la vue de mise à jour, par défaut, tous les champs (à l'exception des clés) sont modifiables. Mais vous pouvez déclarer n'importe quelle propriété en lecture seule ainsi :
<view name="SomeMemberReadOnly">
    <property-view property="name" read-only="true"/>
</view>
Ou, si vous utilisez OX3 :

@ReadOnly(forViews="SomeMembersReadOnly")
private String name;

Comment utiliser des vues différentes pour créer et mettre à jour ?

De manière triviale, vous définissez une vue pour créer et une autre pour la mise à jour, ainsi :

<component ... >
...
    <view name="Creer">
    ...
    </view>
 
    <view name="MettreAJour">
    ...
    </view>
 
</component>
Ou, avec OX3 :

@Views({
    @View(name="Creer", members="  .... "),
    @View(name="MettreAJour", members=" ... ")
})
public class MyEntity { ...
Ensuite, vous devez affiner l'action Nouveau pour choisir la vue Creer et l'action de recherche pour la vue MettreAJour. Tout d'abord, il s'agit de définir un contrôleur dans le fichier controllers.xml de votre projet :
<controller name="MonControleur">
    <action name="nouveau"
        class="com.mycompany.myapplication.actions.MyNewAction"
        image="images/new.gif" on-init="true"
        keystroke="F2">
        <use-object name="xava_view"/>  <!-- Not needed since v4m2-->
    </action>
    <action name="recherche"
        by-default="if-possible" hidden="true"
        class="com.mycompany.myapplication.actions.MySearchAction"
        keystroke="F8">
        <use-object name="xava_view"/>  <!-- Not needed since v4m2-->
    </action>
 </controller>
Et puis il faut assigner le nouveau contrôleur à votre module avant d'écrire les deux nouvelles actions. Dans le fichier application.xml, déclarez votre module ainsi :
<module name="MonModule">
    <env-var name="XAVA_SEARCH_ACTION" value="MonControleur.recherche"/>
    <model name="MonComposant"/>
    <controller name="MonControleur"/>
</module>
Il ne reste plus qu'à écrire le code des actions. Tout d'abord l'action de recherche MySearchAction :
public class MySearchAction extends SearchByViewKeyAction {
    public void execute() throws Exception {
        getView().setViewName("Update");
        super.execute();
    }
}
Et l'action de création MyNewAction :
public class MyNewAction extends NewAction {
    public void execute() throws Exception {
        getView().setViewName("Create");
        super.execute();
    }
}

Comment désactiver une propriété lors de la mise à jour, mais pas lors de la création ?

Vous pouvez affiner les action de création et de recherche. Tout d'abord, définissez un contrôleur ainsi :
<controller name="MonControleur">
    <action name="nouveau"
        class="com.mycompany.myapplication.actions.MyNewAction"
        image="images/new.gif" on-init="true"
        keystroke="F2">
        <use-object name="xava_view"/>  <!-- Not needed since v4m2-->
    </action>
    <action name="recherche"
        by-default="if-possible" hidden="true"
        class="com.mycompany.myapplication.actions.MySearchAction"
        keystroke="F8">
        <use-object name="xava_view"/>  <!-- Not needed since v4m2-->
    </action>
 </controller>
Puis assignez le contrôleur à votre module avant d'écrire le code de vos deux nouvelles actions. Dans le fichier application.xml, déclarez votre module ainsi :
<module name="MyModule">
    <env-var name="XAVA_SEARCH_ACTION" value="MonControleur.recherche"/>
    <model name="MonComposant"/>
    <controller name="MonControleur"/>
</module>
Pour finir, écrire le code des deux actions. Pour MySearchAction :
public class MySearchAction extends SearchByViewKeyAction {
    public void execute() throws Exception {
        super.execute();
        getView().setEditable("myproperty", false);
    }
}
Et MyNewAction :
public class MyNewAction extends NewAction {
    public void execute() throws Exception {
        super.execute();
        getView().setEditable("myproperty", true);
    }
}

Comment accéder à une propriété qui n'est pas visible dans la vue ?

A partir des vues, vous pouvez obtenir uniquement les données visibles. Mais il est possible, en utilisant la classe MapFacade, d'accéder directement au modèle.
Vous pouvez écrire dans votre action un code approchant :
public class MyAction extends ViewBaseAction {
 
    public void execute() throws Exception {
        Invoice invoice = (Invoice) MapFacade.findEntity(getModelName(), getView().getKeyValues());
        BigDecimal specialDiscount = invoice.getSpecialDiscount(); // Special discount n'est pas visible
        ...
    }
    ...